JSX Runtime
JSXを書いている利用者は特に意識することはない
React本家のblog
参考
従来
code:ts
import React from 'react';
function App() {
return <h1>Hello World</h1>;
}
従来
code:ts
import React from 'react';
function App() {
return React.createElement('h1', null, 'Hello world');
}
React 16以前では、import React from 'react' を明示的に書く必要があった
Babel や TypeScript が JSX を React.createElement(...) に変換するため、React がスコープ内に必要だったから
今後
code:ts
import {jsx as _jsx} from 'react/jsx-runtime';
function App() {
return _jsx('h1', { children: 'Hello world' });
}
JSXからJSに変換する結果が変わった
内部でのパフォーマンスの最適化をしやすくなる
当時はclassでcomponentを書くのが普通だったので、それに適していた
しかし、functional componentには適していない
React.createElementは、JSXの実装として意図したものではなく、当時のツールでできる最善のものだった
JSXが糖衣構文であることに留意するmrsekut.icon
React.createElementは自分で書くことも意図されていた
jsxではなく、素のreactを書く、みたいな言い方がされていたと思うmrsekut.icon
パフォーマンスの最適化がやりづらい
childrenの扱いが、transpile時に決定できるのにruntime時にやってて効率が悪い
buid sizeが少し小さくなる
明示的にReactをimportしないでいい
これはuserが書いているtranspile前のコードの話をしているmrsekut.icon
新しい JSX 変換方式を使う
code:js
/** @jsxRuntime automatic */
古い JSX 変換方式を使う
typescriptを使っている時